1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package com.google.common.testing;
18
19 import static com.google.common.base.Preconditions.checkNotNull;
20 import static junit.framework.Assert.assertEquals;
21 import static junit.framework.Assert.assertTrue;
22
23 import com.google.common.annotations.Beta;
24 import com.google.common.annotations.GwtCompatible;
25 import com.google.common.base.Equivalence;
26 import com.google.common.collect.ImmutableList;
27 import com.google.common.collect.Lists;
28 import com.google.common.testing.RelationshipTester.ItemReporter;
29
30 import java.util.List;
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60 @Beta
61 @GwtCompatible public final class EquivalenceTester<T> {
62 private static final int REPETITIONS = 3;
63
64 private final Equivalence<? super T> equivalence;
65 private final RelationshipTester<T> delegate;
66 private final List<T> items = Lists.newArrayList();
67
68 private EquivalenceTester(Equivalence<? super T> equivalence) {
69 this.equivalence = checkNotNull(equivalence);
70 this.delegate = new RelationshipTester<T>(
71 equivalence, "equivalent", "hash", new ItemReporter());
72 }
73
74 public static <T> EquivalenceTester<T> of(Equivalence<? super T> equivalence) {
75 return new EquivalenceTester<T>(equivalence);
76 }
77
78
79
80
81
82
83 public EquivalenceTester<T> addEquivalenceGroup(T first, T... rest) {
84 addEquivalenceGroup(Lists.asList(first, rest));
85 return this;
86 }
87
88 public EquivalenceTester<T> addEquivalenceGroup(Iterable<T> group) {
89 delegate.addRelatedGroup(group);
90 items.addAll(ImmutableList.copyOf(group));
91 return this;
92 }
93
94
95 public EquivalenceTester<T> test() {
96 for (int run = 0; run < REPETITIONS; run++) {
97 testItems();
98 delegate.test();
99 }
100 return this;
101 }
102
103 private void testItems() {
104 for (T item : items) {
105
106
107
108
109 assertTrue(item + " must be inequivalent to null", !equivalence.equivalent(item, null));
110 assertTrue("null must be inequivalent to " + item, !equivalence.equivalent(null, item));
111 assertTrue(item + " must be equivalent to itself", equivalence.equivalent(item, item));
112 assertEquals("the hash of " + item + " must be consistent", equivalence.hash(item),
113 equivalence.hash(item));
114 }
115 }
116 }